package cn.donting.jme.edit.scene;

import cn.donting.jme.edit.attribute.Attribute;
import cn.donting.jme.edit.ex.AutoAttributeLoader;
import cn.donting.jme.edit.ex.ExResourcesLoad;
import com.jme3.export.JmeExporter;
import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule;
import com.jme3.export.Savable;
import com.jme3.scene.control.Control;
import lombok.Getter;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class ControlMapper implements Savable {
    public static final String key="_SpatialControlMapper";

    @Getter
    private ArrayList<ControlAttributesMapper> controlAttributesMappers=new ArrayList<>();


    public void addController(Control control){
        ControlAttributesMapper controlAttributesMapper=new ControlAttributesMapper();
        controlAttributesMapper.setClassName(control.getClass().getName());
        controlAttributesMapper.setTitle(control.getClass().getSimpleName());
        Field[] fields = control.getClass().getFields();
        for (Field field : fields) {
            AutoAttributeLoader autoAttributeLoader = getAutoAttributeLoader(field, control);
            Attribute attribute = autoAttributeLoader.getAttribute(field, control);
            controlAttributesMapper.addAttribute(attribute);
        }
        controlAttributesMappers.add(controlAttributesMapper);
    }


    /**
     * 重新加载
     * @param classLoader
     */
    public void reload(ClassLoader classLoader){
        //删除类
        //字段名改变
        //字段类型改变
        //注解改变
    }

    private AutoAttributeLoader getAutoAttributeLoader(Field field, Object obj){
        List<AutoAttributeLoader> autoAttributeLoaders = ExResourcesLoad.getAutoAttributeLoaders();
        for (AutoAttributeLoader autoAttributeLoader : autoAttributeLoaders) {
            if (autoAttributeLoader.isLoad(field,obj)) {
                return autoAttributeLoader;
            }
        }
        return null;
    }

    @Override
    public void write(JmeExporter ex) throws IOException {
        OutputCapsule capsule = ex.getCapsule(this);
        capsule.writeSavableArrayList(controlAttributesMappers,"controlAttributesMappers",new ArrayList());
    }

    @Override
    public void read(JmeImporter im) throws IOException {
        controlAttributesMappers=im.getCapsule(this).readSavableArrayList("controlAttributesMappers",new ArrayList());
    }
}
